/****************************************************************************************
 * A compiler et à exécuter en spécifiant le classpath de Jasper.
 ***************************************************************************************/

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class InterfaceJava {
	public static void main(String[] args) {
		if (args.length < 1) {
			System.out
			.println("Erreur, nombre d'arguments du main invalide. Doit contenir le port");
			System.exit(0);
		}

		String filename = "Prolog/SRC/heagone-ia.pl";
		if (System.getProperty("user.name").equals("sofy")) {
			filename = "Prolog/SRC/heagone-ia.pl";
		}

		ServerSocket serv;
		Socket sock = null;
		int port = Integer.parseInt(args[0]);

		try {
			serv = new ServerSocket(port);
			sock = serv.accept();
			System.out.println("Serveur Java connecté au client c");
			
			DataInputStream dis = new DataInputStream(sock.getInputStream());
			DataOutputStream dos = new DataOutputStream(sock.getOutputStream());
			PrologQuestionneur pq = new PrologQuestionneur();

			boolean premier = false;
			Couleur couleur = Couleur.BLEU;

			int prem = dis.readInt();
			if (prem == 1) {
				premier = true;
				couleur = Couleur.ROUGE;
				pq.setJoueurPremier();
			}
			
			boolean res = pq.init(couleur, filename);
			if (!res) {
				System.out.println("Erreur initilisation du plateau");
			}

			

			System.out.println("Premier = " + prem);			
			
			boolean finTournoi = false;
			while (!finTournoi) {
				int tour = 0;
				boolean partieContinue = true;

				System.out.println();
				System.out.println("Début partie");
				while (partieContinue) {
					System.out.println("Tour " + tour + ", Joueur " + couleur + ", premier : " + premier);
					if (premier) {
						System.out.println("Joueur 1, tour " + tour);
						// Calcul coup IA
						Coup coup = pq.genereCoup();

						envoiCoup(dos, coup);
						System.out.println("Coup envoyé : " + coup);

						partieContinue = receptPartieContinue(dis);

						if (partieContinue) {
							Coup coup_adv = receptCoupAdv(dis);
							pq.joueCoup(coup_adv.depart, coup_adv.arrivee);

							System.out.println("Coup adv recu : " + coup_adv);
						}

					} else {
						partieContinue = receptPartieContinue(dis);
						if (partieContinue) {
							Coup coup_adv = receptCoupAdv(dis);
							System.out.println("Coup adv recu : " + coup_adv);

							// Applique le coup de l'adversaire
							pq.joueCoup(coup_adv.depart, coup_adv.arrivee);

							// Calcule coup IA
							Coup coup = pq.genereCoup();
							envoiCoup(dos, coup);
							System.out.println("Coup envoyé : " + coup);

							partieContinue = receptPartieContinue(dis);
							
						}
					}
					System.out.println("La partie continue : "
							+ partieContinue);
					tour++;
				}
				System.out.println("Fin partie");
				finTournoi = receptFinTournoi(dis);
				if (!finTournoi) {
					pq = new PrologQuestionneur();
					res = pq.init(couleur, filename);
					if (!res) {
						System.out.println("Erreur initilisation du plateau");
					}
					prem = dis.readInt();
					if (prem == 1) {
						premier = true;
						pq.setJoueurPremier();
					} else {
						premier = false;
					}
				}
			}
			
			// Fin du tournoi
			dos.close();
			dis.close();
			serv.close();
			sock.close();
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}

		System.out.println("End of InterfaceJava");
		System.out.println("Bye bye");

	}

	private static boolean receptFinTournoi(DataInputStream dis)
			throws IOException {
		int ft = dis.readInt();
		if (ft == 1) {
			return true;
		}
		return false;
	}

	private static boolean receptPartieContinue(DataInputStream dis)
			throws IOException {
		int pc = dis.readInt();
		if (pc == 1) {
			return true;
		}
		return false;
	}

	private static Coup receptCoupAdv(DataInputStream dis) throws IOException {
		int xdep = dis.readInt();
		int ydep = dis.readInt();
		int xarr = dis.readInt();
		int yarr = dis.readInt();

		return new Coup(-1, -1, xdep, ydep, xarr, yarr);
	}

	private static void envoiCoup(DataOutputStream dos, Coup coup)
			throws IOException {
		dos.writeInt(coup.type);
		dos.writeInt(coup.bloque);
		dos.writeInt(coup.depart.x);
		dos.writeInt(coup.depart.y);
		dos.writeInt(coup.arrivee.x);
		dos.writeInt(coup.arrivee.y);
	}
}
